/******************************************************************************************
 * Import
 ******************************************************************************************/
import _ from 'lodash';
import Http from './base/http';
import Collect from './base/colelct';

/******************************************************************************************
 * Export Class
 ******************************************************************************************/

export default class HttpHesq extends Http {

    /**
     * 重写父类getHeaders方法
     */
    static getHeaders() {
        return {
            "Content-Type": "application/x-www-form-urlencoded"
        };
    }

    /**
     * 重写父类parse方法
     * 
     * @param {String} text 从服务器返回的原始字符串
     * @param {Object} obj 设置对象
     */
    static parse(text, obj) {

        // 判断字符串是否能被解析为json对象，如果成功则将text转换为json，否则报解析错误
        // 注意：taro有时会自动将字符串转换为json，所以，这里需要做判断，看text是否为string，如果已经是json，就不要转转了
        if (_.isString(text)) {
            try {
                text = JSON.parse(text);
            } catch(e) {
                Collect.parseFail(text, obj);
                if (_.has(obj, 'config.fail.parse')) {
                    obj.config.fail.parse(text, obj);
                }
                return;
            }
        }

        // 转换为json
        const json = _.isString(text) ? JSON.parse(text) : text;

        // json格式判断，如果返回没有带code字段，则说明服务器出错，收集错误，调用错误回调，并直接返回
        if (!_.has(json, 'code', 'msg', 'data')) {
            Collect.formatFail(text, obj);
            if (_.has(obj, 'config.fail.format')) {
                obj.config.fail.format(text, obj);
            }
            return;
        }

        // 逻辑错误判断，如果code不等于0，则说明存在逻辑错误，收集错误，调用错误回调，并直接返回
        if (parseInt(json.code) != 0) {
            if (_.isFunction(obj.error)) {
                obj.error(json, obj);
            }
            return;
        }

        // 已经全部正确正确，调用success回调
        if (_.isFunction(obj.success)) {
            obj.success(json.data, obj);
        }
    }
}
